home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_10_02
/
1002097b
< prev
next >
Wrap
Text File
|
1991-01-13
|
3KB
|
81 lines
/* RECUR is a recursive descent subroutine to search
directories and subs with wildcard and path
capabilities -> then pass the path name
to a user supplied function called "subfunc".
2 switches are presently supported: totals
and subs for subdirectories.
*/
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAX_SUB 128
extern void subfunc(char *path);
int recurs(char *path, int subs, int totals)
{
struct find_t *fib;
char *drive, *dir, *fname, *ext;
char *tmppath, *tmpdir;
char (*subfifoptr)[_MAX_FNAME];
char *subfifo;
int total = 0;
/* malloc so we don't blow up the stack */
fib = malloc(sizeof(struct find_t));
drive = malloc(_MAX_DRIVE);
dir = malloc(_MAX_DIR);
fname = malloc(_MAX_FNAME);
ext = malloc(_MAX_EXT);
tmpdir = malloc(_MAX_DIR);
tmppath = malloc(_MAX_PATH);
if (subs)
{
/* if subs switch - do subdirectories first, RECURSIVELY */
subfifo = *subfifoptr =
(char *)malloc(_MAX_FNAME * MAX_SUB);
_splitpath(path, drive, dir, fname, ext);
_makepath(tmppath, drive, dir, "*", "*");
if (!_dos_findfirst(tmppath, _A_SUBDIR, fib))
do
{
if (fib->name[0] != '.' && fib->attrib &
_A_SUBDIR)
strcpy(*subfifoptr++, fib->name);
} while (!_dos_findnext(fib) && *subfifoptr <
&subfifo[(_MAX_FNAME - 1) * MAX_SUB]);
**subfifoptr = NULL; /* terminate fifo */
*subfifoptr = subfifo; /* reset fifo pointer */
while(**subfifoptr) /* while not at the end */
{
strcpy(tmpdir, dir);
_makepath(tmppath, drive,
strcat(tmpdir, *subfifoptr++), fname, ext);
total += recurs(tmppath, subs, totals);
}
free(subfifo);
}
if (!_dos_findfirst(path, _A_NORMAL, fib))
do
{
_splitpath(path, drive, dir, fname, ext);
strcpy(tmppath, drive);
strcat(tmppath, dir);
subfunc(strcat(tmppath, fib->name));
total++;
} while (!_dos_findnext(fib));
if (totals)
printf("\ntotal = %d\t%s files\n", total, path);
free(fib), free(drive), free(dir), free(fname);
free(ext), free(tmpdir), free(tmppath);
return total;
}